package asem.ast.sentencias;

import alex.Token;
import asem.TablaSimbolos;
import asem.excepciones.ExcepcionAtributoInexistente;
import asem.excepciones.ExcepcionIncompatibilidadDeTipos;
import asem.tablaSimbolos.Clase;
import asem.tablaSimbolos.tipo.Tipo;
import asem.tablaSimbolos.tipo.TipoClase;

public class NodoIDEncadenado {
	protected Token identificador;
	protected NodoIDEncadenado siguiente;

	public NodoIDEncadenado(Token t) {
		identificador = t;
		siguiente = null;
	}

	public void setSiguiente(NodoIDEncadenado sig) {
		siguiente = sig;
	}

	public Tipo chequeoSentencias() {
		TablaSimbolos tabla = TablaSimbolos.getInstance();
		NodoIDEncadenado auxiliar = siguiente;
		Token idActual = identificador;
		Clase claseActual = tabla.claseActual();

		if (claseActual.getAtributosDeInstancia().get(idActual.getLexema()) == null)
			throw new ExcepcionAtributoInexistente(claseActual.getNombre(),
					idActual);
		else {
			Tipo tipoIdentificador = claseActual.getAtributosDeInstancia()
					.get(idActual.getLexema()).getTipo();
			if (!(tipoIdentificador instanceof TipoClase))
				throw new ExcepcionIncompatibilidadDeTipos(
						tipoIdentificador.toString());
			while (auxiliar != null) {
				claseActual = tabla.getClases().get(idActual.getLexema());
				idActual = auxiliar.getIdentificador();
				if (claseActual.getAtributosDeInstancia().get(idActual) == null)
					throw new ExcepcionAtributoInexistente(
							claseActual.getNombre(), idActual);
				tipoIdentificador = claseActual.getAtributosDeInstancia()
						.get(idActual.getLexema()).getTipo();
				if (!(tipoIdentificador instanceof TipoClase))
					throw new ExcepcionIncompatibilidadDeTipos(
							tipoIdentificador.toString());
				auxiliar = auxiliar.getSiguiente();
			}
			return tipoIdentificador;
		}

	}

	private NodoIDEncadenado getSiguiente() {
		return siguiente;
	}

	public Token getIdentificador() {
		return identificador;
	}

}
